home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
Tools
/
Packer
/
xad
/
Developer
/
Sources
/
clients
/
PackDev.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-11-06
|
4KB
|
147 lines
#ifndef XADMASTER_PACKDEV_C
#define XADMASTER_PACKDEV_C
/* Programmheader
Name: PackDev.c
Main: xadmaster
Versionstring: $VER: PackDev.c 1.0 (13.06.1998)
Author: SDI
Distribution: Freeware
Description: PackDev disk archiver client
1.0 13.06.98 : first version
*/
#include <proto/xadmaster.h>
#include "SDI_compiler.h"
#include "xpkstuff.c"
#ifndef XADMASTERFILE
#define PackDev_Client FirstClient
#define NEXTCLIENT 0
UBYTE version[] = "$VER: PackDev 1.0 (13.06.1998)";
#endif
#define PACKDEV_VERSION 1
#define PACKDEV_REVISION 0
struct PackDevHead {
ULONG pd_Header; /* equals 'PKD\x13' */
ULONG pd_BlockNum; /* Number of blocks */
ULONG pd_BlockSize; /* size of one block */
ULONG pd_Reserved; /* Reserved blocks */
ULONG pd_TrackLength; /* Length of one track*/
ULONG pd_xpkBufferSize; /* in byte */
ULONG pd_xpkPacker; /* XPK packer type */
ULONG pad1;
ULONG pad2;
ULONG pad3;
ULONG pad4;
ULONG pad5;
UWORD pd_xpkMode; /* XPK mode Number 0..100 */
UWORD pd_KnownFileSys; /* When all data stored, this is 0, else 1 */
};
ASM(BOOL) PackDev_RecogData(REG(d0, ULONG size), REG(a0, STRPTR data),
REG(a6, struct xadMasterBase *xadMasterBase))
{
if(((ULONG *)data)[0] == 0x504B4413)
return 1;
else
return 0;
}
/* maybe there are some errors in that code, not tested yet */
ASM(LONG) PackDev_GetInfo(REG(a0, struct xadArchiveInfo *ai),
REG(a6, struct xadMasterBase *xadMasterBase))
{
struct PackDevHead h;
LONG err;
struct ExecBase * SysBase = xadMasterBase->xmb_SysBase;
if(!(err = xadHookAccess(XADAC_READ, sizeof(struct PackDevHead), &h, ai)))
{
struct xadDiskInfo *xdi;
ULONG blksiz = 0, i, dat[9];
STRPTR buf = 0;
if(h.pd_KnownFileSys)
{
blksiz = h.pd_BlockNum;
if(h.pd_xpkPacker)
err = xpkDecrunch(&buf, &i, ai, xadMasterBase);
else
{
if(!(buf = (STRPTR) AllocVec((i = blksiz>>8), MEMF_ANY)))
err = XADERR_NOMEMORY;
else
err = xadHookAccess(XADAC_READ, i, buf, ai);
}
}
/* check for password flag */
if(!err && !(err = xadHookAccess(XADAC_READ, 36, dat, ai)) &&
!(err = xadHookAccess(XADAC_INPUTSEEK, -36, 0, ai)))
{
if(dat[8] & (1<<25))
ai->xai_Flags |= XADAIF_CRYPTED;
}
if(!err)
{
if((xdi = (struct xadDiskInfo *) xadAllocObject(XADOBJ_DISKINFO,
blksiz ? XAD_OBJBLOCKENTRIES : TAG_DONE, blksiz, TAG_DONE)))
{
if(ai->xai_Flags & XADAIF_CRYPTED)
xdi->xdi_Flags |= XADDIF_CRYPTED;
xdi->xdi_Flags |= XADDIF_NOCYLINDERS|XADDIF_NOLOWCYL|
XADDIF_NOHIGHCYL|XADDIF_NOHEADS|XADDIF_NOCYLSECTORS;
xdi->xdi_TotalSectors = h.pd_BlockNum;
xdi->xdi_SectorSize = h.pd_BlockSize;
xdi->xdi_TrackSectors = h.pd_TrackLength / h.pd_BlockSize;
xdi->xdi_EntryNumber = 1;
xdi->xdi_PrivateInfo = (APTR) h.pd_xpkPacker;
ai->xai_DiskInfo = xdi;
/* does nothing if blksiz == 0 */
for(i = 0; i < blksiz; ++i)
{
if(i < h.pd_Reserved || (buf[i/8] & ((1 << (7-(i%8))))))
xdi->xdi_BlockInfo[i] |= XADBIF_CLEARED;
}
}
else
err = XADERR_NOMEMORY;
}
if(buf)
FreeVec(buf);
}
return err;
}
/* still missing */
ASM(LONG) PackDev_UnArchive(REG(a0, struct xadArchiveInfo *ai),
REG(a6, struct xadMasterBase *xadMasterBase))
{
return XADERR_INPUT;
}
ASM(void) PackDev_Free(REG(a0, struct xadArchiveInfo *ai),
REG(a6, struct xadMasterBase *xadMasterBase))
{
if(ai->xai_DiskInfo)
{
xadFreeObjectA(ai->xai_DiskInfo, 0);
ai->xai_DiskInfo = 0; /* clear the entry */
}
}
struct xadClient PackDev_Client = {
NEXTCLIENT, XADCLIENT_VERSION, 1, PACKDEV_VERSION, PACKDEV_REVISION,
4, XADCF_DISKARCHIVER, 0/*XADCID_PACKDEV*/, "PackDev",
(BOOL (*)()) PackDev_RecogData, (LONG (*)()) PackDev_GetInfo,
(LONG (*)()) PackDev_UnArchive, (void (*)()) PackDev_Free};
#endif /* XADASTER_PACKDEV_C */